package framework.helpers;

import org.openqa.selenium.By;
import framework.ApplicationManager;
import framework.entities.AppointmentData;

public class VisitsHelper extends BaseHelperForRmis
{
    public VisitsHelper(ApplicationManager app) {
        super(app);
    }

	/**
	 * Создает назначение. 
	 * Открывает расширенную форму редактирования услуги, создает начначение, заполняет поля и сохраняет назначение.
	 *
	 * @param appointmentData данные для предварительной записи
	 */	
	public void createPrescription(AppointmentData appointmentData) {
		log.info("Создание назначения:" + appointmentData);
		openExtendedServiceForm(appointmentData.service);
		openPrescriptionCreationForm();
		fillPrescriptionCreationForm(appointmentData);
	}
	
	private void openExtendedServiceForm(String service) {
		click(By.xpath("//tr[contains(td, '" + service + "')]"));
		click(By.cssSelector("[title='Перейти на расширенную форму редактирования услуги'] a"));
	}
	
	private void openPrescriptionCreationForm() {
		click(By.xpath("//*[@id='prescriptionSectionIdTabTitle']/a"));
		click(By.xpath("(//a[contains(text(),'Добавить')])[3]"));
	}
	
	private void fillPrescriptionCreationForm(AppointmentData appointmentData) {
		chooseMedicalOrganization(appointmentData.medicalOrganization);
		chooseService(appointmentData.service);
		click(By.xpath("(//a[contains(text(),'Сохранить и закрыть')])"));
	}

    private void chooseMedicalOrganization(String medicalOrganization) {
    	if (medicalOrganization.equals("Контрольная"))
    		return;
    	click(By.xpath("//div[@id='prescriptionClinic.valueContainer']/div/div"));
    	typeAndSelectByNumber(By.name("prescriptionClinic.label"), medicalOrganization, 0);
    }
    
    private void chooseService(String service) {
       	click(By.xpath("//div[@id='prescription.service.idContainer']/div/div"));
    	typeAndSelectByNumber(By.name("_prescription.service.idEdit"), service, 0);
    }

	/**
	 * Нажимаем кнопку "Закрыть" на форме услуги
	 */	
	public void closeServiceForm() {
		log.info("Закрытие формы услуги.");
		click(By.xpath("//div[4]/form/div/div/span[5]/a"));
	}

	/**
	 * Выдает больничный лист с заданным периодом
	 *
	 * @param disabilityPeriodFrom дата начала больничного в формате dd.MM.yyyy
	 * @param disabilityPeriodTo дата окончания больничного в формате dd.MM.yyyy
	 */	
	public void giveSickList(String disabilityPeriodFrom, String disabilityPeriodTo) {
		log.info("Выдача листа нетрудоспособности c " + disabilityPeriodFrom + " по " + disabilityPeriodTo);
		click(By.xpath("(//a[contains(text(),'Выдать лист нетрудоспособност')])[2]"));
		type(By.id("disabilityPeriod.from"),disabilityPeriodFrom);
		type(By.id("disabilityPeriod.to"),disabilityPeriodTo);
		click(findElement(By.xpath(".//*[@id='sicklist']/div/div[3]")).findElement(By.cssSelector("[title='Да'] a")));
	}

	/**
	 * Закрывает случай.
	 * На форме посещения нажимает кнопку "Закрыть случай", заполняет оьязательные поля и сохраняет результат
	 */	
	public void closeOccurrence() {
		log.info("Закрытие случая.");
		moveToUp();
		click(By.cssSelector("[title='Закрыть случай'] a"));
		chooseVisitResult();
		clickSaveButton();
	}
	
	private void chooseVisitResult() {
		click(By.cssSelector(".dc-console-close"));
		click(By.xpath("//*[@id='visit.result.idContainer']/div/div"));
    	typeAndSelectByNumber(By.name("visit.result.name"), "", 0);
	}

	/**
	 * Создает направление на форме посещения
	 */	
	public void createReferral(AppointmentData appointmentData) {
		log.info("Создание направления");
		click(By.cssSelector("[title='Действия'] a"));
		mainWindow = getWindowHandle();
		waitWhileAjaxCompleted();
		click(By.xpath("(//a[contains(text(),'Создать направление')])[2]"));
		switchToWindow(getNewWindow());
		chooseReferralType(appointmentData.referralType);
		chooseReferralReceivingOrganization(getReferralOrganization());
		clickSaveButton();
	}
	
	private void chooseReferralType(String referralType) {
    	click(By.xpath("//*[@id='referral.type.idContainer']/div/div"));
    	typeAndSelectByNumber(By.name("_referral.type.idEdit"), referralType, 0);
	}
	
	private void chooseReferralReceivingOrganization(String referralReceivingOrganization) {
    	click(By.xpath("//*[@id='referral.receivingOrganization.idContainer']/div/div"));
    	typeAndSelectByNumber(By.name("_referral.receivingOrganization.idEdit"), referralReceivingOrganization, 0);
	}
	
	private String getReferralOrganization() {
    	return findElement(By.xpath("//*[@id='referral.organization.idContainer']/div/div")).getText();
    }
	
    private void searchSicklist(AppointmentData appointmentData) {
    	log.info("Поиск больничного листа: " + appointmentData);
    	choosePatient(appointmentData.patient);
		click(By.cssSelector("[title='Найти'] a"));
	}

    private void choosePatient(String patient) {
    	click(By.xpath("//div[@id='individual.quick.search0Container']/div/div"));
    	typeAndSelectByNumber(By.name("_individual.quick.search0Edit"), patient, 0);
    }

	public Integer getPrescriptionCount() {
		return findElements(By.cssSelector(".x-grid-row")).size();
	}

	public String getOccurrenceInfo() {
		return findElement(By.id("caseInfoGroup")).getText();
	}

	public String getTextFormSection() {
		return findElement(By.xpath(".//*[@id='hrSectionIdSectionTitle']/a")).getText();
	}

	/**
	 * Возвращает количество найденных больничных листов по клиенту
	 *
	 * @param appointmentData данные для поиска больничного листа
	 * @return количество больничных листов
	 */	
	public int getCountOfSicklist(AppointmentData appointmentData) {
		int countSicklist;
		mainWindow = app.getWebDriverHelper().getDriver().getWindowHandle();
		openInNewWindow("https://rmis.cdmarf.ru/sicklist/sicklists", "sicklist");
		switchToWindow(getNewWindow());
		searchSicklist(appointmentData);
		waitWhileAjaxCompleted();
		countSicklist = getCountRowInGrid();
		app.getWebDriverHelper().getDriver().close();
		switchToWindow(mainWindow);
		return countSicklist;
	}
	
}
